using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.Practices.RepositoryFactory.SchemaDiscovery.ObjectModel.Base;

namespace Microsoft.Practices.RepositoryFactory.CodeGeneration.ObjectModel.DbTypesHelperStrategies
{
   public sealed class SqlServerDbTypesHelper : IDbTypesHelperStrategy
   {
      #region IDbTypesHelperStrategy Members

      public string GetGenericDBType(DatabaseType type)
      {
         switch (type)
         {
            case DatabaseType.Binary: return "DbType.Binary";
            case DatabaseType.Blob: return "DbType.Object";
            case DatabaseType.Boolean: return "DbType.Boolean";
            case DatabaseType.Byte: return "DbType.Byte";
            case DatabaseType.Char: return "DbType.String";
            case DatabaseType.Currency: return "DbType.Currency";
            case DatabaseType.Date: return "DbType.DateTime";
            case DatabaseType.Decimal: return "DbType.Decimal";
            case DatabaseType.Float: return "DbType.Decimal";
            case DatabaseType.Int64: return "DbType.Int64";
            case DatabaseType.Int32: return "DbType.Int32";
            case DatabaseType.Int16: return "DbType.Int16";
            case DatabaseType.NChar: return "DbType.String";
            case DatabaseType.NText: return "DbType.String";
            case DatabaseType.NVarChar: return "DbType.String";
            case DatabaseType.Object: return "DbType.Object";
            case DatabaseType.Real: return "DbType.Decimal";
            case DatabaseType.SmallDate: return "DbType.Date";
            case DatabaseType.SmallCurrency: return "DbType.Decimal";
            case DatabaseType.Text: return "DbType.String";
            case DatabaseType.Timestamp: return "DbType.Binary";
            case DatabaseType.Guid: return "DbType.Guid";
            case DatabaseType.VarBinary: return "DbType.Binary";
            case DatabaseType.VarChar: return "DbType.String";
            default: return "DbType.Object";
         }
      }

      public string GetReaderMethod(DatabaseType type)
      {
         switch (type)
         {
            case DatabaseType.Binary: return "GetBytes";
            case DatabaseType.Blob: return "GetBytes";
            case DatabaseType.Boolean: return "GetBoolean";
            case DatabaseType.Byte: return "GetByte";
            case DatabaseType.Char: return "GetString";
            case DatabaseType.Currency: return "GetDecimal";
            case DatabaseType.Date: return "GetDateTime";
            case DatabaseType.Decimal: return "GetDecimal";
            case DatabaseType.Float: return "GetDouble";
            case DatabaseType.Int64: return "GetInt64";
            case DatabaseType.Int32: return "GetInt32";
            case DatabaseType.Int16: return "GetInt16";
            case DatabaseType.NChar: return "GetString";
            case DatabaseType.NText: return "GetString";
            case DatabaseType.NVarChar: return "GetString";
            case DatabaseType.Object: return "";
            case DatabaseType.Real: return "GetFloat";
            case DatabaseType.SmallDate: return "GetDateTime";
            case DatabaseType.SmallCurrency: return "GetDecimal";
            case DatabaseType.Text: return "GetString";
            case DatabaseType.Timestamp: return "GetBytes";
            case DatabaseType.Guid: return "GetGuid";
            case DatabaseType.VarBinary: return "GetBytes";
            case DatabaseType.VarChar: return "GetString";
            default: return "";

         }
      }

      public string GetClsType(DatabaseType type)
      {
		  switch (type)
		  {
			  case DatabaseType.Binary: return "Byte[]";
			  case DatabaseType.Blob: return "Byte[]";
			  case DatabaseType.Boolean: return "Boolean";
			  case DatabaseType.Byte: return "Byte";
			  case DatabaseType.Char: return "String";
			  case DatabaseType.Currency: return "Decimal";
			  case DatabaseType.Date: return "DateTime";
			  case DatabaseType.Decimal: return "Decimal";
			  case DatabaseType.Float: return "Double";
			  case DatabaseType.Int64: return "Int64";
			  case DatabaseType.Int32: return "Int32";
			  case DatabaseType.Int16: return "Int16";
			  case DatabaseType.NChar: return "String";
			  case DatabaseType.NText: return "String";
			  case DatabaseType.NVarChar: return "String";
			  case DatabaseType.Real: return "Float";
			  case DatabaseType.SmallDate: return "DateTime";
			  case DatabaseType.SmallCurrency: return "Decimal";
			  case DatabaseType.Text: return "String";
			  case DatabaseType.Timestamp: return "Byte[]";
			  case DatabaseType.Guid: return "Guid";
			  case DatabaseType.VarBinary: return "Byte[]";
			  case DatabaseType.VarChar: return "String";
			  default: return "Object";
		  }
	  }

      public string GetProviderType(DatabaseType type)
      {
         throw new NotImplementedException();
      }

      #endregion
   }
}
